package com.ctrip.framework.apollo.biz.utils;

import com.ctrip.framework.apollo.core.ConfigConsts;
import com.google.common.base.Joiner;

public class ReleaseMessageKeyGenerator {

	private static final Joiner STRING_JOINER = Joiner.on(ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR);

	// ReleaseMessage消息内容( ReleaseMessage.message )生成器
	// 将 appId + cluster + namespace 拼接，使用 ConfigConsts.CLUSTER_NAMESPACE_SEPARATOR = "+" 作为间隔，例如："test+default+application"
	// 因此，对于同一个 Namespace ，生成的消息内容是相同的。通过这样的方式，我们可以使用最新的ReleaseMessage的id属性，作为Namespace是否发生变更的标识。而Apollo确实是通过这样的方式实现，Client通过不断使用获得到ReleaseMessage的id属性作为版本号，请求Config Service判断是否配置发生了变化
	// 正因为，ReleaseMessage设计的意图是作为配置发生变化的通知，所以对于同一个Namespace，仅需要保留其最新的ReleaseMessage记录即可。所以，在DatabaseMessageSender中，我们会看到，有后台任务不断清理旧的ReleaseMessage记录
	public static String generate(String appId, String cluster, String namespace) {
		return STRING_JOINER.join(appId, cluster, namespace);
	}

}
